#include<stdio.h>
#include<stdlib.h> // malloc, exit
#include<unistd.h> // fork
#include<signal.h>
#include<sys/wait.h>

// 信号处理函数
void sig_usr(int signo)
{
    int status = 0;
    switch (signo)
    {
    case SIGUSR1:
        printf("收到了 SIGUSR1 信号, 进程ID = %d \n", getpid() );
        break;
    case SIGCHLD:
        {
            printf("收到了 SIGCHLD 信号, 进程ID = %d \n", getpid() );
            pid_t pid = waitpid(-1, &status, WNOHANG);
            if (pid == 0)
            {
                return;
            }
            if (pid == -1)
            {
                return;
            }
            return;
        }
    
    default:
        break;
    }
}

int g_mygbltest = 0;

int main(int argc, char *const *argv)
{
    printf("进程开始执行 \n");

    pid_t pid;

    // 返回两次，一次在子进程，一次在父进程
    pid = fork();

    if (pid < 0)
    {
        printf("fork 失败\n");
        exit(1);
    }
    // 走到这里说明fork成功，后续的代码可能是父进程，也可能是子进程

    // 子进程
    if (pid == 0)
    {
        for (; ; )
        {
            g_mygbltest++;
            sleep(1);
            printf("子进程休息1s, 进程ID = %d ，g_mygbltest = %d\n", getpid(), g_mygbltest);
        }
    }
    else
    {
        for (; ; )
        {
            g_mygbltest++;
            sleep(5);
            printf("......父进程休息5s, 进程ID = %d ，g_mygbltest = %d\n", getpid(), g_mygbltest);
        }
    }

    printf("程序执行结束 \n");

    return 0;
}
